﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace FlyShop
{
    public partial class FrmConsultaAeronave : Form
    {

        // Indica o registro selecionado na grid
        int linhaSelecionadaGrid = -1;

        OleDbConnection conexao;
        OleDbCommand comando;
        OleDbDataAdapter da;
        DataSet ds;
        String strConexao = "Provider=MSDAORA.1;Data Source=localhost;Persist Security Info=True;User ID=pi;Password=pi";
        String sqlConsulta = "select * from aeronave";
        String sqlConsultaFiltro = "select * from aeronave where descricao like ? and prefixo like ?";
        String sqlExcluiRegistro = "delete from aeronave where cod_aeronave = ?";

        public FrmConsultaAeronave()
        {
            InitializeComponent();
        }

        private void FrmConsultaAeronave_Load(object sender, EventArgs e)
        {
            conexao = new OleDbConnection(strConexao);
            conexao.Open();

            // Comando para configurar a sessão
            // Configura para o banco de dados ficar case-insensitive  
            OleDbCommand comandoAlteraSessao = new OleDbCommand("alter session set nls_sort=BINARY_CI", conexao);
            comandoAlteraSessao.ExecuteNonQuery();

            comandoAlteraSessao.CommandText = "alter session set nls_comp=LINGUISTIC";
            comandoAlteraSessao.ExecuteNonQuery();

            atualiza();
            formataGrid();
        }

        private void formataGrid()
        {
            dgvAeronave.Columns[0].Visible = false;
            dgvAeronave.Columns[1].HeaderText = "Descrição";
            dgvAeronave.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvAeronave.Columns[2].HeaderText = "Prefixo";
            dgvAeronave.Columns[2].Width = 80;
            dgvAeronave.Columns[3].HeaderText = "Assentos";
            dgvAeronave.Columns[3].Width = 100;

            dgvAeronave.ScrollBars = ScrollBars.Vertical;
            dgvAeronave.RowHeadersVisible = false;
            dgvAeronave.MultiSelect = false;
            dgvAeronave.AllowUserToAddRows = false;
            dgvAeronave.AllowUserToDeleteRows = false;
            dgvAeronave.ReadOnly = true;
            dgvAeronave.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvAeronave.TabStop = false;
        }

        private void atualiza()
        {
            // Faz uma consulta com todos os registros
            da = new OleDbDataAdapter(sqlConsulta, conexao);
            ds = new DataSet();
            da.Fill(ds, "Aeronave");
            dgvAeronave.DataSource = ds.Tables["Aeronave"];

            // Limpa a seleção e a variável de indicação do código
            dgvAeronave.ClearSelection();
            linhaSelecionadaGrid = -1;

            // Limpa a label de mensagem
            lblMensagem.Text = "";
            alertNotificacao.Hide();

        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                DialogResult drConfirmacao = MessageBox.Show(this, "Deseja excluir o registro selecionado?\nNão será possível excluir o registro caso ele tenha dependências.",
                   "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (drConfirmacao == DialogResult.Yes)
                {
                    comando = new OleDbCommand(sqlExcluiRegistro, conexao);

                    OleDbParameter pCod = new OleDbParameter("cod_aeronave", OleDbType.Integer);
                    pCod.Value = Int32.Parse(dgvAeronave.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                    comando.Parameters.Add(pCod);

                    // Caso o registro em questão tenha dependentes
                    // será lançada uma exceção
                    try
                    {
                        // Delete
                        comando.ExecuteNonQuery();
                        atualiza();
                    }
                    catch (OleDbException)
                    {
                        MessageBox.Show(this, "Não é possível excluir um registro com dependentes.",
                            "Operação inválida", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }

                }
                
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para excluir.";
                alertNotificacao.Show();
            }
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                FrmCadastroAeronave frmEdicao = new FrmCadastroAeronave();
                frmEdicao.Text = "Edição de aeronave";
                frmEdicao.edicao = true;
                frmEdicao.codAeronave = Int32.Parse(dgvAeronave.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                frmEdicao.ShowDialog();

                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            } 
        }

        private void btnCadastrar_Click(object sender, EventArgs e)
        {
            FrmCadastroAeronave frmCadastro = new FrmCadastroAeronave();
            frmCadastro.Text = "Cadastro de aeronave";
            frmCadastro.ShowDialog();
            atualiza();
        }

        private void dgvAeronave_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            linhaSelecionadaGrid = e.RowIndex;
        }

        private void filtro_TextChanged(object sender, EventArgs e)
        {
            comando = new OleDbCommand(sqlConsultaFiltro, conexao);

            OleDbParameter pFiltroDescricao = new OleDbParameter("descricao", OleDbType.VarChar);
            pFiltroDescricao.Value = txtNomeAeronave.Text.Trim() + "%";
            comando.Parameters.Add(pFiltroDescricao);

            OleDbParameter pFiltroPrefixo = new OleDbParameter("prefixo", OleDbType.VarChar);
            pFiltroPrefixo.Value = txtPrefixoAeronave.Text.Trim() + "%";
            comando.Parameters.Add(pFiltroPrefixo);

            da = new OleDbDataAdapter(comando);

            ds.Clear();
            da.Fill(ds, "Aeronave");

            dgvAeronave.DataSource = ds.Tables["Aeronave"];

            dgvAeronave.ClearSelection();
            linhaSelecionadaGrid = -1;
        }

        private void FrmConsultaAeronave_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }

        private void dgvAeronave_Sorted(object sender, EventArgs e)
        {
            dgvAeronave.ClearSelection();
            linhaSelecionadaGrid = -1;
        }

        private void dgvAeronave_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                FrmCadastroAeronave frmEdicao = new FrmCadastroAeronave();
                frmEdicao.Text = "Edição de aeronave";
                frmEdicao.edicao = true;
                frmEdicao.codAeronave = Int32.Parse(dgvAeronave.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                frmEdicao.ShowDialog();

                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            } 
        }

        private void dgvAeronave_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            linhaSelecionadaGrid = e.RowIndex;
        }

        private void FrmConsultaAeronave_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }
            //Hotkey para novo cadastro
            if (e.KeyData == (Keys.Control | Keys.N))
            {
                btnCadastrar_Click(sender, e);
            }
        }
    }
}
